#include "gestao.h"

using namespace std;


Cliente::Cliente(string nome, uint idade, char sexo, float peso, float altura):
		nome(nome), idade(idade), sexo(sexo), peso(peso), altura(altura), IMC(NULL) {

	vector<Alimento> PAlmoco;
	vector<Alimento> Almoco;
	vector<Alimento> Jantar;
	vector<Alimento> RefExtra;

	vector<vector<Alimento> > segunda;
	vector<vector<Alimento> > terca;
	vector<vector<Alimento> > quarta;
	vector<vector<Alimento> > quinta;
	vector<vector<Alimento> > sexta;
	vector<vector<Alimento> > sabado;
	vector<vector<Alimento> > domingo;

	segunda.push_back(PAlmoco);
	segunda.push_back(Almoco);
	segunda.push_back(Jantar);
	segunda.push_back(RefExtra);

	terca.push_back(PAlmoco);
	terca.push_back(Almoco);
	terca.push_back(Jantar);
	terca.push_back(RefExtra);

	quarta.push_back(PAlmoco);
	quarta.push_back(Almoco);
	quarta.push_back(Jantar);
	quarta.push_back(RefExtra);

	quinta.push_back(PAlmoco);
	quinta.push_back(Almoco);
	quinta.push_back(Jantar);
	quinta.push_back(RefExtra);

	sexta.push_back(PAlmoco);
	sexta.push_back(Almoco);
	sexta.push_back(Jantar);
	sexta.push_back(RefExtra);

	sabado.push_back(PAlmoco);
	sabado.push_back(Almoco);
	sabado.push_back(Jantar);
	sabado.push_back(RefExtra);

	domingo.push_back(PAlmoco);
	domingo.push_back(Almoco);
	domingo.push_back(Jantar);
	domingo.push_back(RefExtra);


	dieta.push_back(segunda);
	dieta.push_back(terca);
	dieta.push_back(quarta);
	dieta.push_back(quinta);
	dieta.push_back(sexta);
	dieta.push_back(sabado);
	dieta.push_back(domingo);
}

Cliente::~Cliente() {
}

string Cliente::getNome() const {
	return nome;
}

uint Cliente::getIdade() const {
	return idade;
}

char Cliente::getSexo() const {
	return sexo;
}

float Cliente::getPeso() const {
	return peso;
}

float Cliente::getAltura() const {
	return altura;
}

uint Cliente::getNRefeicoes() const {
	return nRefeicoes;
}

vector<vector<vector <Alimento> > > Cliente::getDieta() const
{
	return dieta;
}

vector<Alimento> Cliente::getAlergias() const {
	return alergias;
}

bool Cliente::getDiabetes() const{
	if(diabetes)
		return true;
	else
		return false;
}

bool Cliente::eDiabetico() const {
	if (diabetes)
		return true;

	return false;
}

bool Cliente::eAlergico(Alimento x)
{
	for(size_t i = 0; i < alergias.size(); i++)
	{
		if(alergias[i] == x)
			return true;
	}

	return false;
}

void Cliente::setNome(string nome){
	this->nome = nome;
}

void Cliente::setIdade(uint idade){
	this->idade = idade;
}

void Cliente::setSexo(char sexo){
	this->sexo = sexo;
}

void Cliente::setPeso(float peso) {
	this->peso = peso;
}

void Cliente::setAltura(float altura){
	this->altura = altura;
}

void Cliente::setNRefeicoes(uint nRefeicoes) {
	this->nRefeicoes = nRefeicoes;
}

void Cliente::setDiabetes()
{
	diabetes = true;
}


float Cliente::calculaIMC() {
	float imc;

	imc = peso / (altura * altura);

	if (imc <= 18.5)
	{
		magreza = true;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 24.9)
	{
		magreza = false;
		saudavel = true;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 29.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = true;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 34.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = true;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 39.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = true;
		obesidadeMorbida = false;
	}
	else if (imc >= 40.0)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = true;
	}

	IMC = imc;
	return imc;
}

bool Cliente::operator == (Cliente cliente) const{
	if (this->nome == cliente.nome)
		return true;

	return false;
}

void Cliente::adicionaPAlmoco(Alimento x, uint dia)
{
	/*uint posicao;

	if(dia == 1)
		posicao = 0;
	else
		posicao = 2^dia;

	dieta[posicao].push_back(x);*/
	//uint cont = 1;
	/*for(size_t i = 0; i < dieta.size(); i+=4)
	{
		if(cont == dia){
			dieta[i].push_back(x);
			return;
		}
		cont++;
	}*/
	dia--;
	dieta[dia][0].push_back(x);

}

void Cliente::adicionaAlmoco(Alimento x, uint dia)
{
	/*uint posicao;

	if(dia == 1)
		posicao = 1;
	else
		posicao = 2^dia + 1;

	dieta[posicao].push_back(x);*/
	//uint cont = 1;
	/*for(size_t i = 1; i < dieta.size(); i+=4)
	{
		if(cont == dia){
			dieta[i].push_back(x);
			return;
		}
		cont++;
	}*/
	dia--;
	dieta[dia][1].push_back(x);

}

void Cliente::adicionaJantar(Alimento x, uint dia)
{
	/*uint posicao;

	if(dia == 1)
			posicao = 2;
		else
			posicao = 2^dia + 2;

		dieta[posicao].push_back(x);*/
	dia--;
	dieta[dia][2].push_back(x);
}

void Cliente::adicionaRefExtra(Alimento x, uint dia)
{
	/*uint posicao;

	if(dia == 1)
			posicao = 3;
		else
			posicao = 2^dia + 3;

		dieta[posicao].push_back(x);*/
	dia--;
	dieta[dia][3].push_back(x);
}

bool Cliente::setAlergia(Alimento x)
{
	alergias.push_back(x);

	if(alergias.back() == x)
		return true;
	else
		return false;
}

void Cliente::adicionaAlergia(Alimento x)
{
	alergias.push_back(x);
}

void Cliente::listaAlimentos()
{
	for(size_t i = 0; i < dieta.size(); i++){
		if(i == 0)
			cout << "#### Segunda-feira ####\n";
		if(i == 1)
			cout << "#### Terca-feira ####\n";
		if(i == 2)
			cout << "#### Quarta-feira ####\n";
		if(i == 3)
			cout << "#### Quinta-feira ####\n";
		if(i == 1)
			cout << "#### Sexta-feira ####\n";
		if(i == 1)
			cout << "#### Sabado ####\n";
		if(i == 1)
			cout << "#### Domingo ####\n";

		for(size_t k=0; k < dieta[i].size(); k++){
			for(size_t j = 0; j < dieta[i][k].size();j++ ){




				cout << dieta[i][k][j].getID() << " - " << dieta[i][k][j].getNome() << ", " << dieta[i][k][j].getCalorias() << " calorias." << endl;

				}
			}
		if(calculaCalorias(i) > 0)
			cout << calculaCalorias(i) << " calorias no total." << endl;
		}
	}


void Cliente::removeAlimento( uint ali){
	for(size_t i = 0; i < dieta.size(); i++){
		for(size_t k=0; k < dieta[i].size(); k++){
			for(size_t j = 0; j < dieta[i][k].size(); j++){
				if(dieta[i][k][j].getID() == ali){
				dieta[i][k].erase(dieta[i][k].begin()+j);
				}
			}
		}
	}
}

uint Cliente::calculaCalorias(uint dia)
{
	uint cont = 0;

	for(size_t i = 0; i < dieta[dia].size(); i ++)
	{
		for(size_t j = 0; j < dieta[dia][i].size(); j++)
		{
			cont += dieta[dia][i][j].getCalorias();
		}
	}
	return cont;
}
